﻿#ifndef DAMESSAGEHANDLER_H
#define DAMESSAGEHANDLER_H
#include "DAMessageHandlerGlobal.h"
#include <QObject>
namespace DA
{
/**
 * @brief 注册一个普通的消息处理
 *
 * 普通的消息处理仅仅在stdout输出，但会写入到一个全局队列中，
 * 用户可以通过声明一个@sa DAGlobalMessageQueue 对象获取最近的n条消息
 * @param queueCount 消息的条数
 */
void DAMESSAGEHANDLER_API daRegisterStdOutMessageHandler(int queueCount = 1000);

/**
 * @brief 注册一个旋转文件的消息处理
 *
 * 针对qDebug等内容写入文件，且文件可以进行旋转，所谓旋转既是可以指定文件大小和文件数量，日志文件永远不会超过指定的大小和数量
 *
 * 通过@sa qSetMessagePattern 可以设置输出的文本内容
 * @note 此函数在main函数调用
 * @note 需要调用@sa daUnregisterMessageHandler 释放
 * @param filename 日志文件名
 * @param maxfile_size 最大文件尺寸(byte)，默认10mb
 * @param maxfile_counts 最大文件数量，默认5个
 * @param flush_every_sec 日志定时刷新秒数，默认15秒
 * @param output_stdout 输出到stdout
 * @param async_logger 使用异步日志,默认使用
 */
void DAMESSAGEHANDLER_API daRegisterRotatingMessageHandler(const QString& filename,
                                                           int maxfile_size    = 1048576 * 10,
                                                           int maxfile_counts  = 5,
                                                           int flush_every_sec = 15,
                                                           bool output_stdout  = true,
                                                           bool async_logger   = true);

/**
 * @brief 设置消息的模板
 *
 * da消息占位符有如下：
 *
 * - {level} 代表是否打印消息等级，消息等级有debug/warn/critical/error/info五种
 * - {datetime} 代表日期
 * - {line} 代表打印行号
 * - {fun} 代表打印函数名
 * - {file} 代表打印文件名
 * - {msg} 代表消息主体
 * @param p patter字符串，默认为[{datetime}][{line}]{msg}
 */
void DAMESSAGEHANDLER_API daSetMessagePattern(const QString& p);

/**
 * @brief 设置记录进入全局消息队列的消息等级，默认为QtWarningMsg
 * @sa QtMsgType
 * @param type
 */
void DAMESSAGEHANDLER_API daSetMsgQueueRecordMsgType(QtMsgType type);

/**
 * @brief 注销
 * @note 最后需要调用此函数进行释放
 */
void DAMESSAGEHANDLER_API daUnregisterMessageHandler();

}  // namespace DA

#endif  // DAMESSAGEHANDLER_H
